package br.museu.negocio;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import org.joda.time.LocalDate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import br.museu.constantes.ConstantesSistema;
import br.museu.dao.basic.intefaces.ITicketDAO;
import br.museu.excessoes.QuantidadeTicketsInvalidaException;
import br.museu.model.Evento;
import br.museu.model.Ticket;
import br.museu.model.Usuario;
import br.museu.negocio.interfaces.ITicketNegocio;

@Service("ticketNegocio")
@Transactional
public class TicketNegocio implements ITicketNegocio {

	@Autowired
	private ITicketDAO ticketDAO;

	public TicketNegocio() {
	}

	public void comprarTicket(Ticket ticket) throws QuantidadeTicketsInvalidaException {

		if (ticket.getMeiaEntrada().equals(ConstantesSistema.SIM)) {
			ticket.setValor(ticket.getEvento().getValorTicket() / 2);
		} else {
			ticket.setValor(ticket.getEvento().getValorTicket());
		}

		if (ticket.getQtdTickets() == 0) {
			throw new QuantidadeTicketsInvalidaException();
		}

		List<Ticket> tickets = new ArrayList<Ticket>();

		for (int i = 0; i < ticket.getQtdTickets(); i++) {
			ticket.setDtEmissao(LocalDate.now());
			ticket.setCodigo(this.gerarCodigoTicket(ticket.getUsuario().getId(), ticket.getEvento().getId(), ticket.getMeiaEntrada(), i));
			tickets.add(ticket);
		}

		ticketDAO.comprarTicket(tickets);
	}

	private String gerarCodigoTicket(Integer usuarioId, Integer eventoId, String meiaEntrada, int indice) {
		String codigo = "TK_" + usuarioId + eventoId + meiaEntrada + Calendar.getInstance().get(Calendar.DATE) + Calendar.getInstance().get(Calendar.MONTH) + Calendar.getInstance().get(Calendar.YEAR) + indice;

		return codigo;
	}

	public void cancelarCompraTicket(String codigoTicket) {
		Ticket ticket = ticketDAO.consultarPorCodigo(codigoTicket);
		ticketDAO.remover(ticket);
	}

	public List<Ticket> listarTicketsEvento(Evento evento) {
		return ticketDAO.listarTicketsEvento(evento);
	}

	public List<Ticket> listarTicketsUsuario(Usuario usuario) {

		if (usuario.getId() == null) {
			return new ArrayList<Ticket>();
		}

		return ticketDAO.listarTicketsUsuario(usuario);
	}

	public int contarTicketsVendidosEvento(Evento evento) {
		return listarTicketsEvento(evento).size();
	}

	public Double calcularTotalTicketsVendidosEvento(Evento evento) {
		List<Ticket> lista = listarTicketsEvento(evento);

		Double valor = 0.0;

		for (Ticket ticket : lista) {
			valor += ticket.getValor();
		}

		return valor;
	}

	public Double calcularTotalTicketsVendidosMes(LocalDate data) {
		List<Ticket> lista = ticketDAO.listarTicketsVendidosMes(data);

		Double valor = 0.0;

		for (Ticket ticket : lista) {
			valor += ticket.getValor();
		}

		return valor;
	}

	public Double calcularTotalTicketsVendidosDia() {
		List<Ticket> lista = ticketDAO.listarTicketsVendidosDia();

		Double valor = 0.0;

		for (Ticket ticket : lista) {
			valor += ticket.getValor();
		}

		return valor;
	}

}
